#' 最大化的值函数
#'
#' @param ktp1 控制变量\code{k_{t+1}}
#' @param kt \code{k_t}
#' @param k0 各个特定点的状态变量
#' @param vlast 用来插值的值函数。仅用于beta * V(k_next)时的计算。
#'
#' @return 本期的值函数。加负号是为了后续优化的技术需求。
#'
valfun <- function(ktp1, kt, beta, theta, delta, k0 = seq(0.06,6,0.06), vlast = rep(0,100)){
  # 线性插值以平滑t-1期的值函数，这实际上假设了资本存量和值函数之间存在一个线性关系
  # 这是因为值函数那根曲线是由点构成的，点和点之间就用线性插值
  g <- signal::interp1(k0,vlast,ktp1,'linear')
  cc <- kt^theta-ktp1+(1-delta)*kt

  if (cc<=0){
    # 避免值函数为负
    val <- -888-800*abs(cc)
  } else val <- log(cc)+beta*g

  return(-val)
}
